package com.igeek.d0607;

import java.io.*;

/**
 * @Author: zhiyu
 * @Date:19:40
 * @DESC:
 */
public class Test6 {
    public static void main(String[] args) throws FileNotFoundException {
        File source = new File("D:\\桌面\\极客营\\作业");
        File target = new File("D:\\桌面\\极客营\\copy");

        listFiles(source, target);
        System.out.println("复制完毕！");
    }
    /**
     * 罗列文件及文件夹
     * 递归遍历执行copyFile方法最终实现文件夹复制
     * @param source
     * @param target
     */
    public static void listFiles(File source, File target) throws FileNotFoundException {
        //定义File数组
        File[] files = null;
        if (source.exists()) {
            //将source路径下的所有文件列出来，通过listFiles方法返回File数组
            files = source.listFiles();
        }
        if(!target.exists()) {
            //target目标文件夹不存在时，创建target文件夹
            target.mkdirs();
            System.out.println("创建一个"+target.getAbsolutePath()+"文件夹");
        }
        //如果source文件下存在文件及文件夹执行for循环语句
        if(files!=null) {
            for(int i=0;i<files.length;i++) {
                //创建一个File对象
                File temp=new File(target,files[i].getName());
                //判断是否是文件，false则是文件夹
                if(files[i].isFile()) {
                    //执行copuFile()方法复制文件
                    copyFile(files[i],temp);
                }else {
                    //当for循环遍历到一个文件夹时，递归调用listFiles()方法
                    listFiles(files[i],temp);//重要操作！！！
                }
            }
        }
    }
    /**
     * 复制文件
     * @param source
     * @param target
     */
    public static void copyFile(File source, File target) throws FileNotFoundException {
        // 定义变量
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(source));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(target));

        try(bis;bos){

            // 定义字节数组，用来存放输入流读取的字节
            byte[] b = new byte[1024];
            // 定义一个整型len，主要用来记录输入流读取字节长度，
            // 1 判断文件是否读取完毕 2 确定输出流写入到文件的字节数
            int len = 0;

            // 输入流读取文件到末尾时，返回-1
            while ((len = bis.read(b)) != -1) {
                // 输出流将字节数组写入到文件中去
                bos.write(b, 0, len);
            }

            System.out.println(source.getAbsolutePath()+"--->>>"+target.getAbsolutePath()+"复制完成！");
        } catch (Exception e) {
            e.printStackTrace();;
        }
    }
}
